package cn.csc.module.product.dal.mysql.stocklock;

import java.math.BigInteger;
import java.util.*;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.csc.framework.mybatis.core.mapper.BaseMapperX;
import cn.csc.module.product.dal.dataobject.stocklock.SkuStockLockDO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
import cn.csc.module.product.controller.admin.stocklock.vo.*;
import org.apache.ibatis.annotations.Param;

/**
 * 库存锁定信息 Mapper
 *
 * @author liuchuang
 */
@Mapper
public interface SkuStockLockMapper extends BaseMapperX<SkuStockLockDO> {

    default PageResult<SkuStockLockDO> selectPage(SkuStockLockPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SkuStockLockDO>()
                .eqIfPresent(SkuStockLockDO::getSpuId, reqVO.getSpuId())
                .eqIfPresent(SkuStockLockDO::getSkuId, reqVO.getSkuId())
                .eqIfPresent(SkuStockLockDO::getOrderId, reqVO.getOrderId())
                .eqIfPresent(SkuStockLockDO::getStatus, reqVO.getStatus())
                .eqIfPresent(SkuStockLockDO::getCount, reqVO.getCount())
                .betweenIfPresent(SkuStockLockDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(SkuStockLockDO::getId));
    }

    default List<SkuStockLockDO> selectList(SkuStockLockExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<SkuStockLockDO>()
                .eqIfPresent(SkuStockLockDO::getSpuId, reqVO.getSpuId())
                .eqIfPresent(SkuStockLockDO::getSkuId, reqVO.getSkuId())
                .eqIfPresent(SkuStockLockDO::getOrderId, reqVO.getOrderId())
                .eqIfPresent(SkuStockLockDO::getStatus, reqVO.getStatus())
                .eqIfPresent(SkuStockLockDO::getCount, reqVO.getCount())
                .betweenIfPresent(SkuStockLockDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(SkuStockLockDO::getId));
    }

    /**
     * 根据订单号获取锁定的库存
     *
     * @param orderIds 订单号
     * @return 锁定的库存信息
     */
    default List<SkuStockLockDO> listByOrderIds(@Param("orderIds") List<BigInteger> orderIds){
        return selectList(new LambdaQueryWrapperX<SkuStockLockDO>()
                // 查询指定字段
                .select(SkuStockLockDO::getId,SkuStockLockDO::getSkuId,
                        SkuStockLockDO::getSpuId,SkuStockLockDO::getCount)
                .in(SkuStockLockDO::getOrderId,orderIds)
                .eq(SkuStockLockDO::getStatus,0)
        );
    }

    /**
     * 将锁定状态标记为已解锁
     *
     * @param lockIds ids
     */
    default Integer unLockByIds(List<BigInteger> lockIds){
        LambdaUpdateWrapper<SkuStockLockDO> updateWrapper = new LambdaUpdateWrapper();
        updateWrapper.set(SkuStockLockDO::getStatus,-1);
        updateWrapper.in(SkuStockLockDO::getId,lockIds);
        return update(null,updateWrapper);
    }

    /**
     * 正式锁定库存，标记为使用状态
     *
     * @param orderIds 锁定库存的订单
     */
    default Integer markerStockUse(@Param("orderIds") List<BigInteger> orderIds){
        LambdaUpdateWrapper<SkuStockLockDO> updateWrapper = new LambdaUpdateWrapper();
        updateWrapper.set(SkuStockLockDO::getStatus, 1);
        updateWrapper.in(SkuStockLockDO::getId, orderIds);
        return update(null,updateWrapper);
    }

    /**
     * 根据订单号获取已取消锁定的库存
     *
     * @param orderIds 订单号
     * @return 锁定的库存信息
     */
    default List<SkuStockLockDO> listUnLockByOrderIds(List<BigInteger> orderIds){
        return selectList(new LambdaQueryWrapperX<SkuStockLockDO>()
                // 查询指定字段
                .select(SkuStockLockDO::getId,SkuStockLockDO::getSkuId,
                        SkuStockLockDO::getSpuId,SkuStockLockDO::getCount)
                .in(SkuStockLockDO::getOrderId,orderIds)
                .eq(SkuStockLockDO::getStatus,-1)
        );
    }



}
